package com.ty.web.monitor;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;

import java.io.File;

/**
 * 图片文件监视器（观察者模式）
 *
 * <p>
 *     Apache Commons IO的文件监控机制基于轮询（Polling）原理
 * </p>
 *
 * @Author Tommy
 * @Date 2024/4/19
 */
@Slf4j
public class ImagesFileMonitor {

    // 文件监视器对象
    private FileAlterationMonitor monitor;

    // 监视目录对象
    private File dir;

    // 检测频率，单位：秒
    private Integer interval;

    /**
     * 实例化图片文件监视器对象
     *
     * @param dir 监视目录对象
     */
    public ImagesFileMonitor(File dir) {
        this(dir, 1);
    }

    /**
     * 实例化图片文件监视器对象
     *
     * @param dir       监视目录对象
     * @param interval  检测频率，单位：秒
     */
    public ImagesFileMonitor(File dir, Integer interval) {
        this.dir = dir;
        this.interval = interval;
        monitor = new FileAlterationMonitor(interval * 1000);
    }

    /**
     * 初始化
     *
     * @return ImagesFileMonitor
     */
    public ImagesFileMonitor init() {
        // 创建文件观察者
        FileAlterationObserver observer = new FileAlterationObserver(this.dir, FileFilterUtils.and(
           FileFilterUtils.fileFileFilter(), // 只监测文件
           new SuffixFileFilter(".jpg", ".jpeg", ".png") // 只关注这些后缀文件
        ));

        // 向观察者添加事件回调对象
        observer.addListener(new ImageFileCallbackEvent());

        // 向文件监视器添加观察者
        this.monitor.addObserver(observer);
        return this;
    }

    /**
     * 启动监视器
     *
     * @throws Exception
     */
    public void start() throws Exception {
        this.monitor.start();
        log.info("启动监视器：{}", this.dir.getPath());
    }
}
